package com.elitedatai.mchtest.manage.service.impl;

import com.dji.sdk.cloudapi.livestream.DockLivestreamAbilityUpdate;
import com.dji.sdk.cloudapi.livestream.RcLivestreamAbilityUpdate;
import com.dji.sdk.cloudapi.livestream.api.AbstractLivestreamService;
import com.dji.sdk.mqtt.state.TopicStateRequest;
import com.elitedatai.mchtest.manage.model.receiver.CapacityDeviceReceiver;
import com.elitedatai.mchtest.manage.service.ICapacityCameraService;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Service;

import java.util.List;


/**
 * SDK直播流服务实现类
 * 用于处理设备直播能力更新的业务逻辑
 */
@Service
public class SDKLivestreamService extends AbstractLivestreamService {

    /**
     * 容量相机服务接口，用于保存相机容量信息
     */
    @Autowired
    private ICapacityCameraService capacityCameraService;

    /**
     * JSON对象映射器，用于数据转换
     */
    @Autowired
    private ObjectMapper objectMapper;

    /**
     * 处理停靠站直播能力更新事件
     * 当停靠站的直播能力发生变化时，该方法会被调用
     *
     * @param request 包含停靠站直播能力更新信息的请求对象
     * @param headers 消息头信息
     */
    @Override
    public void dockLivestreamAbilityUpdate(TopicStateRequest<DockLivestreamAbilityUpdate> request, MessageHeaders headers) {
        // 保存直播容量信息到数据库
        saveLiveCapacity(request.getData().getLiveCapacity().getDeviceList());
    }

    /**
     * 处理遥控器直播能力更新事件
     * 当遥控器的直播能力发生变化时，该方法会被调用
     *
     * @param request 包含遥控器直播能力更新信息的请求对象
     * @param headers 消息头信息
     */
    @Override
    public void rcLivestreamAbilityUpdate(TopicStateRequest<RcLivestreamAbilityUpdate> request, MessageHeaders headers) {
        // 保存直播容量信息到数据库
        saveLiveCapacity(request.getData().getLiveCapacity().getDeviceList());
    }

    /**
     * 保存直播容量信息
     * 将设备列表中的相机信息保存到数据库中
     *
     * @param data 设备列表数据对象
     */
    private void saveLiveCapacity(Object data) {
        // 将传入的数据转换为容量设备接收器列表
        List<CapacityDeviceReceiver> devices = objectMapper.convertValue(
                data, new TypeReference<List<CapacityDeviceReceiver>>() {});
        System.out.println("saveLiveCapacity devices: " + devices);

        // 遍历设备列表，为每个设备保存相机列表信息
        for (CapacityDeviceReceiver capacityDeviceReceiver : devices) {
            // 调用容量相机服务，保存设备的相机列表信息
            capacityCameraService.saveCapacityCameraReceiverList(
                    capacityDeviceReceiver.getCameraList(), capacityDeviceReceiver.getSn());
        }
    }
}